package typecheck;



import java.util.ArrayList;
import java.util.List;

import syntaxtree.Type;
public class ClassEntry  {
	
	String parentName;
	ClassEntry parentClass;
	HashT tiposMetodos;
	//	Vetor contendo os MethodEntries correspondentes aos metodos da classe em questao.
	public ArrayList<MethodEntry> metodos;

	// Hash com os simbolos da classe: nomes de variaveis ou nome de metodo -> tipo
	HashT simbolos;

	final String className;
	
	public String getClassName() {
		return className;
	}
	
	public ClassEntry (String className, String parentName) {
		metodos = new ArrayList<MethodEntry>();
		tiposMetodos = new HashT();
		simbolos = new HashT();
		this.className = className;
		this.parentName = parentName;
		this.parentClass = null;
	}

	public ArrayList<MethodEntry> getMetodos() {
		return metodos;
	}

	public void addMetodos(MethodEntry metodo) {
		this.metodos.add(metodo);
		metodo.setPai(this);
		this.tiposMetodos.insert(metodo.getNome(), metodo.getTipoDoRetorno());
	}

	public HashT getSimbolos() {
		return simbolos;
	}
	public void addSimbolo(String s, Type t) {
		simbolos.insert(s, t);
	}

	public void setSimbolos(HashT variaveis) {
		this.simbolos = variaveis;
	}
	
	public String getParentName() {
		return parentName;
	}
	
	public ClassEntry getParentClass() {
		return parentClass;
	}
	
	public void setParentClass(ClassEntry parentClass) {
		this.parentClass = parentClass;
	}
	
	public Type lookupVariable(String id) {
		Type field = simbolos.lookup(id);
		
		if (field == null && parentClass != null) {
			field = parentClass.lookupVariable(id);
		}
		
		return field;
	}

	public Type lookupMethod(String id) {
		Type methodReturn = tiposMetodos.lookup(id);
		
		if (methodReturn == null && parentClass != null) {
			methodReturn = parentClass.lookupMethod(id);
		}
		
		return methodReturn;
	}
	
	/*
	@Override
	public void dump(IndentingWriter out) {
		out.println();
		out.indent();
		
		out.println("metodos:");
		out.indent();
		for (Entry<String, MethodEntry> entry : metodos) {
			out.print(entry.getKey());
			out.print(": ");
			out.print(entry.getValue());
		}
		out.outdent();
		
		out.println("variaveis:");
		out.indent();
		for (Entry<String, Type> entry : variaveis) {
			out.print(entry.getKey());
			out.print(": ");
			out.print(entry.getValue());
			out.println();
		}
		out.outdent();
		out.outdent();
	}
	*/
}
